图表问题

原因

Chart主题

源码修改

......
import java.awt.RenderingHints;
import org.jfree.chart.StandardChartTheme;
......

    private static JFreeChart createChart(PieDataset dataset) {
      
      StandardChartTheme theme = new StandardChartTheme("unicode") {  
          public void apply(JFreeChart chart) {  
              chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,  
                      RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);  
              super.apply(chart);                                          // 应用消除文字锯齿
          }  
      };  
      theme.setExtraLargeFont(new Font("SansSerif", Font.PLAIN, 20));    // 设置逻辑字体
      theme.setLargeFont(new Font("SansSerif", Font.PLAIN, 14));         // 设置逻辑字体
      theme.setRegularFont(new Font("SansSerif", Font.PLAIN, 12));       // 设置逻辑字体
      theme.setSmallFont(new Font("SansSerif", Font.PLAIN, 10));          // 设置逻辑字体

      ChartFactory.setChartTheme(theme);                                       // 设置新主题
      
        JFreeChart chart = ChartFactory.createPieChart(
            "Some Unicode Text in the Title : \u4E76",                   // chart title test
            dataset);

        System.out.println(chart.getTitle().getFont());                // debug 字体输出
        return chart;
    }
package org.adempiere.apps.graph;

import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.RefineryUtilities;

public class test extends ApplicationFrame {

    public test(String title) {
        super(title);
        setContentPane(createDemoPanel());
    }
     
    
    private static PieDataset createDataset() {
        DefaultPieDataset dataset = new DefaultPieDataset();
        dataset.setValue("苹果", new Double(27.8));
        dataset.setValue("Others", new Double(55.3));
        dataset.setValue("Nokia", new Double(16.8));
        dataset.setValue("Apple", new Double(17.1));
        return dataset;
    }
     
    
    private static JFreeChart createChart(PieDataset dataset) {
      
      StandardChartTheme theme = new StandardChartTheme("unicode") ;  
      theme.setExtraLargeFont(new Font("SansSerif", Font.PLAIN, 20));  
      theme.setLargeFont(new Font("SansSerif", Font.PLAIN, 14));  
      theme.setRegularFont(new Font("SansSerif", Font.PLAIN, 12));  
      theme.setSmallFont(new Font("SansSerif", Font.PLAIN, 10)); 
      ChartFactory.setChartTheme(theme);            
      
        JFreeChart chart = ChartFactory.createPieChart(
            "Some Unicode Text in the Title : \u4E76",  // chart title
            dataset);

        //  如果不添加主题,返回Tahoma字体乱码,如果添加主题,返回逻辑字体 SansSerif
        // 测试java.awt.font的字体集
        java.awt.GraphicsEnvironment eq = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment();
        String[] fontNames = eq.getAvailableFontFamilyNames(); 
        for(int i=0;i<fontNames.length;i++){
          System.out.println(fontNames[i]); 
        }
        
        // 测试标题字体
                 System.out.println(chart.getTitle().getFont());       
        return chart;   
    }

    public static JPanel createDemoPanel() {
        JFreeChart chart = createChart(createDataset());
        chart.setPadding(new RectangleInsets(4, 8, 2, 2));
        ChartPanel panel = new ChartPanel(chart);
        panel.setMouseWheelEnabled(true);
        panel.setPreferredSize(new Dimension(600, 300));
        return panel;
    }

    public static void main(String[] args) {
        test demo = new test("JFreeChart Unicode Test");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }

}

参考